<?php

// 公共助手函数

use Symfony\Component\VarExporter\VarExporter;
use app\admin\model\SetText;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Sms\V20190711\Models\SendSmsRequest;
use TencentCloud\Sms\V20190711\SmsClient;
use app\admin\model\Set;
use zop\ZopClient;
use zop\ZopProperties;
use zop\ZopRequest;

if (!function_exists('__')) {

    /**
     * 获取语言变量值
     * @param string $name 语言变量名
     * @param array  $vars 动态变量值
     * @param string $lang 语言
     * @return mixed
     */
    function __($name, $vars = [], $lang = '')
    {
        if (is_numeric($name) || !$name) {
            return $name;
        }
        $av='av';
        if (!is_array($vars)) {
            $vars = func_get_args();
            array_shift($vars);
            $lang = '';
        }
        return \think\Lang::get($name, $vars, $lang);
    }
}

if (!function_exists('format_bytes')) {

    /**
     * 将字节转换为可读文本
     * @param int    $size      大小
     * @param string $delimiter 分隔符
     * @return string
     */
    function format_bytes($size, $delimiter = '')
    {
        $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
        for ($i = 0; $size >= 1024 && $i < 6; $i++) {
            $size /= 1024;
        }
        return round($size, 2) . $delimiter . $units[$i];
    }
}

if (!function_exists('datetime')) {

    /**
     * 将时间戳转换为日期时间
     * @param int    $time   时间戳
     * @param string $format 日期时间格式
     * @return string
     */
    function datetime($time, $format = 'Y-m-d H:i:s')
    {
        $time = is_numeric($time) ? $time : strtotime($time);
        return date($format, $time);
    }
}

if (!function_exists('human_date')) {

    /**
     * 获取语义化时间
     * @param int $time  时间
     * @param int $local 本地时间
     * @return string
     */
    function human_date($time, $local = null)
    {
        return \fast\Date::human($time, $local);
    }
}

if (!function_exists('cdnurl')) {

    /**
     * 获取上传资源的CDN的地址
     * @param string  $url    资源相对地址
     * @param boolean $domain 是否显示域名 或者直接传入域名
     * @return string
     */
    function cdnurl($url, $domain = false)
    {
        $regex = "/^((?:[a-z]+:)?\/\/|data:image\/)(.*)/i";
        $url = preg_match($regex, $url) ? $url : \think\Config::get('upload.cdnurl') . $url;
        if ($domain && !preg_match($regex, $url)) {
            $domain = is_bool($domain) ? request()->domain() : $domain;
            $url = $domain . $url;
        }
        return $url;
    }
}


if (!function_exists('is_really_writable')) {

    /**
     * 判断文件或文件夹是否可写
     * @param string $file 文件或目录
     * @return    bool
     */
    function is_really_writable($file)
    {
        if (DIRECTORY_SEPARATOR === '/') {
            return is_writable($file);
        }
        if (is_dir($file)) {
            $file = rtrim($file, '/') . '/' . md5(mt_rand());
            if (($fp = @fopen($file, 'ab')) === false) {
                return false;
            }
            fclose($fp);
            @chmod($file, 0777);
            @unlink($file);
            return true;
        } elseif (!is_file($file) or ($fp = @fopen($file, 'ab')) === false) {
            return false;
        }
        fclose($fp);
        return true;
    }
}

if (!function_exists('rmdirs')) {

    /**
     * 删除文件夹
     * @param string $dirname  目录
     * @param bool   $withself 是否删除自身
     * @return boolean
     */
    function rmdirs($dirname, $withself = true)
    {
        if (!is_dir($dirname)) {
            return false;
        }
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::CHILD_FIRST
        );

        foreach ($files as $fileinfo) {
            $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
            $todo($fileinfo->getRealPath());
        }
        if ($withself) {
            @rmdir($dirname);
        }
        return true;
    }
}

if (!function_exists('copydirs')) {

    /**
     * 复制文件夹
     * @param string $source 源文件夹
     * @param string $dest   目标文件夹
     */
    function copydirs($source, $dest)
    {
        if (!is_dir($dest)) {
            mkdir($dest, 0755, true);
        }
        foreach (
            $iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
                RecursiveIteratorIterator::SELF_FIRST
            ) as $item
        ) {
            if ($item->isDir()) {
                $sontDir = $dest . DS . $iterator->getSubPathName();
                if (!is_dir($sontDir)) {
                    mkdir($sontDir, 0755, true);
                }
            } else {
                copy($item, $dest . DS . $iterator->getSubPathName());
            }
        }
    }
}

if (!function_exists('mb_ucfirst')) {
    function mb_ucfirst($string)
    {
        return mb_strtoupper(mb_substr($string, 0, 1)) . mb_strtolower(mb_substr($string, 1));
    }
}

if (!function_exists('addtion')) {

    /**
     * 附加关联字段数据
     * @param array $items  数据列表
     * @param mixed $fields 渲染的来源字段
     * @return array
     */
    function addtion($items, $fields)
    {
        if (!$items || !$fields) {
            return $items;
        }
        $fieldsArr = [];
        if (!is_array($fields)) {
            $arr = explode(',', $fields);
            foreach ($arr as $k => $v) {
                $fieldsArr[$v] = ['field' => $v];
            }
        } else {
            foreach ($fields as $k => $v) {
                if (is_array($v)) {
                    $v['field'] = isset($v['field']) ? $v['field'] : $k;
                } else {
                    $v = ['field' => $v];
                }
                $fieldsArr[$v['field']] = $v;
            }
        }
        foreach ($fieldsArr as $k => &$v) {
            $v = is_array($v) ? $v : ['field' => $v];
            $v['display'] = isset($v['display']) ? $v['display'] : str_replace(['_ids', '_id'], ['_names', '_name'], $v['field']);
            $v['primary'] = isset($v['primary']) ? $v['primary'] : '';
            $v['column'] = isset($v['column']) ? $v['column'] : 'name';
            $v['model'] = isset($v['model']) ? $v['model'] : '';
            $v['table'] = isset($v['table']) ? $v['table'] : '';
            $v['name'] = isset($v['name']) ? $v['name'] : str_replace(['_ids', '_id'], '', $v['field']);
        }
        unset($v);
        $ids = [];
        $fields = array_keys($fieldsArr);
        foreach ($items as $k => $v) {
            foreach ($fields as $m => $n) {
                if (isset($v[$n])) {
                    $ids[$n] = array_merge(isset($ids[$n]) && is_array($ids[$n]) ? $ids[$n] : [], explode(',', $v[$n]));
                }
            }
        }
        $result = [];
        foreach ($fieldsArr as $k => $v) {
            if ($v['model']) {
                $model = new $v['model'];
            } else {
                $model = $v['name'] ? \think\Db::name($v['name']) : \think\Db::table($v['table']);
            }
            $primary = $v['primary'] ? $v['primary'] : $model->getPk();
            $result[$v['field']] = $model->where($primary, 'in', $ids[$v['field']])->column("{$primary},{$v['column']}");
        }

        foreach ($items as $k => &$v) {
            foreach ($fields as $m => $n) {
                if (isset($v[$n])) {
                    $curr = array_flip(explode(',', $v[$n]));

                    $v[$fieldsArr[$n]['display']] = implode(',', array_intersect_key($result[$n], $curr));
                }
            }
        }
        return $items;
    }
}

if (!function_exists('var_export_short')) {

    /**
     * 返回打印数组结构
     * @param string $var 数组
     * @return string
     */
    function var_export_short($var)
    {
        return VarExporter::export($var);
    }
}

if (!function_exists('letter_avatar')) {
    /**
     * 首字母头像
     * @param $text
     * @return string
     */
    function letter_avatar($text)
    {
        $total = unpack('L', hash('adler32', $text, true))[1];
        $hue = $total % 360;
        list($r, $g, $b) = hsv2rgb($hue / 360, 0.3, 0.9);

        $bg = "rgb({$r},{$g},{$b})";
        $color = "#ffffff";
        $first = mb_strtoupper(mb_substr($text, 0, 1));
        $src = base64_encode('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="' . $bg . '" x="0" y="0" width="100" height="100"></rect><text x="50" y="50" font-size="50" text-copy="fast" fill="' . $color . '" text-anchor="middle" text-rights="admin" alignment-baseline="central">' . $first . '</text></svg>');
        $value = 'data:image/svg+xml;base64,' . $src;
        return $value;
    }
}

if (!function_exists('hsv2rgb')) {
    function hsv2rgb($h, $s, $v)
    {
        $r = $g = $b = 0;

        $i = floor($h * 6);
        $f = $h * 6 - $i;
        $p = $v * (1 - $s);
        $q = $v * (1 - $f * $s);
        $t = $v * (1 - (1 - $f) * $s);

        switch ($i % 6) {
            case 0:
                $r = $v;
                $g = $t;
                $b = $p;
                break;
            case 1:
                $r = $q;
                $g = $v;
                $b = $p;
                break;
            case 2:
                $r = $p;
                $g = $v;
                $b = $t;
                break;
            case 3:
                $r = $p;
                $g = $q;
                $b = $v;
                break;
            case 4:
                $r = $t;
                $g = $p;
                $b = $v;
                break;
            case 5:
                $r = $v;
                $g = $p;
                $b = $q;
                break;
        }

        return [
            floor($r * 255),
            floor($g * 255),
            floor($b * 255)
        ];
    }
}

if (!function_exists('check_nav_active')) {
    /**
     * 检测会员中心导航是否高亮
     */
    function check_nav_active($url, $classname = 'active')
    {
        $auth = \app\common\library\Auth::instance();
        $requestUrl = $auth->getRequestUri();
        $url = ltrim($url, '/');
        return $requestUrl === str_replace(".", "/", $url) ? $classname : '';
    }
}

if (!function_exists('check_cors_request')) {
    /**
     * 跨域检测
     */
    function check_cors_request()
    {
        if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN']) {
            $info = parse_url($_SERVER['HTTP_ORIGIN']);
            $domainArr = explode(',', config('fastadmin.cors_request_domain'));
            $domainArr[] = request()->host(true);
            if (in_array("*", $domainArr) || in_array($_SERVER['HTTP_ORIGIN'], $domainArr) || (isset($info['host']) && in_array($info['host'], $domainArr))) {
                header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
            } else {
                header('HTTP/1.1 403 Forbidden');
                exit;
            }

            header('Access-Control-Allow-Credentials: true');
            header('Access-Control-Max-Age: 86400');

            if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
                if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
                    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
                }
                if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
                    header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
                }
                exit;
            }
        }
    }
}

if (!function_exists('xss_clean')) {
    /**
     * 清理XSS
     */
    function xss_clean($content, $is_image = false)
    {
        return \app\common\library\Security::instance()->xss_clean($content, $is_image);
    }
}
if(!function_exists('dd')){
    function dd($val=''){
        dump($val);exit;
    }
}

if (!function_exists('imageUrl')) {

    /**
     * 富文本获取图片
     *
     */
    function imageUrl($content) {

        $url = "http://".$_SERVER['SERVER_NAME'];
        $pregRule = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.jpg|\.jpeg|\.png|\.gif|\.bmp]))[\'|\"].*?[\/]?>/";
        $content = preg_replace($pregRule, '<img src="${1}" style="max-width:100%">', $content);
        return $content;
    }
}

if (!function_exists('get_app_image_url')) {
    /**
     *  图片展示
     * 设置图片展示路径
     */
    function get_app_image_url($file) {
        if (empty($file)) {
            return '';
        }
        if (strpos($file, "http") === 0) {
            return $file;
        } else if (strpos($file, "/") === 0) {
//            dd(\think\Config::get('upload.cdnurl1'));
            return \think\Config::get('upload.cdnurl1') . $file;
        } else {
            $img = \think\Config::get('upload.cdnurl')  . $file;

            return $img;
        }

    }
}
/**
 * 获取配置信息
 * */
if(!function_exists('get_set')){
    function get_set($field='*',$where='id=1'){
        return Set::where($where)->field($field)->find();
    }
}

/**
 * 获取商家扣点
 * */
if(!function_exists('get_deduct')){
    function get_deduct($id='1',$field='bao_deduct'){
        $ShopApply =  \app\common\model\ShopApply::get($id);
        return $ShopApply[$field];
    }
}

/**
 * 获取配置信息
 * */
if(!function_exists('get_text_set')){
    function get_text_set($field='*',$where='id=1'){
        return SetText::where($where)->field($field)->find();
    }
}
if (!function_exists('myRand')) {

    function myRand(){
        if(PHP_VERSION < '4.2.0'){
            srand();
        }
        $randArr = array();
        for($i = 0; $i < 3; $i++){
            $randArr[$i] = rand(0, 9);
            $randArr[$i + 3] = chr(rand(0, 25) + 97);
        }
        shuffle($randArr);
        return implode('', $randArr);
    }
}
/*
 * 星期几友好展示
 * */
if (!function_exists('what_day')){
    function what_day($val=''){
        $weekarray=array("日","一","二","三","四","五","六");
        return "星期".$weekarray[date("w",strtotime($val))];
    }
}
if(!function_exists('order_no')){
    function order_no(){
        return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    }
}
/*
 * 发送短信
 * */
if(!function_exists('send_sms')){
    function send_sms($mobile,$ParamSet=[],$TemplateID=773760){

        /* 必要步骤：
            * 实例化一个认证对象，入参需要传入腾讯云账户密钥对 secretId 和 secretKey
            * 本示例采用从环境变量读取的方式，需要预先在环境变量中设置这两个值
            * 您也可以直接在代码中写入密钥对，但需谨防泄露，不要将代码复制、上传或者分享给他人
            * CAM 密钥查询：https://console.cloud.tencent.com/cam/capi */

        $cred = new Credential(config('xiaoyi.secretId'), config('xiaoyi.secretKey'));
        //$cred = new Credential(getenv("TENCENTCLOUD_SECRET_ID"), getenv("TENCENTCLOUD_SECRET_KEY"));

        // 实例化一个 http 选项，可选，无特殊需求时可以跳过
        $httpProfile = new HttpProfile();
        $httpProfile->setReqMethod("GET");  // POST 请求（默认为 POST 请求）
        $httpProfile->setReqTimeout(30);    // 请求超时时间，单位为秒（默认60秒）
        $httpProfile->setEndpoint("sms.tencentcloudapi.com");  // 指定接入地域域名（默认就近接入）

        // 实例化一个 client 选项，可选，无特殊需求时可以跳过
        $clientProfile = new ClientProfile();
        $clientProfile->setSignMethod("TC3-HMAC-SHA256");  // 指定签名算法（默认为 HmacSHA256）
        $clientProfile->setHttpProfile($httpProfile);

        // 实例化 SMS 的 client 对象，clientProfile 是可选的
        $client = new SmsClient($cred, "ap-shanghai", $clientProfile);

        // 实例化一个 sms 发送短信请求对象，每个接口都会对应一个 request 对象。
        $req = new SendSmsRequest();

        /* 填充请求参数，这里 request 对象的成员变量即对应接口的入参
         * 您可以通过官网接口文档或跳转到 request 对象的定义处查看请求参数的定义
         * 基本类型的设置:
         * 帮助链接：
         * 短信控制台：https://console.cloud.tencent.com/smsv2
         * sms helper：https://cloud.tencent.com/document/product/382/3773 */

        /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID，例如1400006666 */
//        dd(config('xiaoyi.sms')["Appid"]);
        $req->SmsSdkAppid = config('xiaoyi.sms')["Appid"];
        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
        $req->Sign = config('xiaoyi.sms')['Sign'];

        /* 短信码号扩展号: 默认未开通，如需开通请联系 [sms helper] */
        $req->ExtendCode = "0";
        /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
           * 例如+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
        $req->PhoneNumberSet = [$mobile];
        /* 国际/港澳台短信 senderid: 国内短信填空，默认未开通，如需开通请联系 [sms helper] */
        $req->SenderId = "";
        /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
        $req->SessionContext = "xxx";
        /* 模板 ID: 必须填写已审核通过的模板 ID。可登录 [短信控制台] 查看模板 ID */
        $req->TemplateID = $TemplateID;
        /* 模板参数: 若无模板参数，则设置为空*/
//        $msg="您好，尊敬的{$name1}先生/女士，您预约{$name2}的医生的视频会诊，将在{$name3}开始，还要烦请{$name4}先生/女士做好时间安排，这样我们可以更好的为您提供医疗服务！";
        $req->TemplateParamSet = $ParamSet;


        // 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
        $resp = $client->SendSms($req);

        // 输出 JSON 格式的字符串回包
        $json =  $resp->toJsonString();
        $data = json_decode($json,true)['SendStatusSet'];
        foreach ($data as $k=>$v){
            if($v['Code']=='Ok'){
                return true;
            }
        }
        return  false;
    }
}

/**
 * @param $arr
 * @param $key
 * @return mixed二维数组去重
 */
if (!function_exists('assoc_unique')) {
    function assoc_unique($arr, $key) {
        $tmp_arr = array();
        foreach ($arr as $k => $v) {
            if (in_array($v[$key], $tmp_arr)) {//搜索$v[$key]是否在$tmp_arr数组中存在，若存在返回true
                unset($arr[$k]);
            } else {
                $tmp_arr[] = $v[$key];
            }
        }
        sort($arr); //sort函数对数组进行排序
        return $arr;
    }
}
/**
 * 普通二维数组转键值
 */
if (!function_exists('toArray')) {
    function toArray($data, $key_name = '', $value_name = '') {
        //空值判断
        if (!$data)
            return array();
        //一维对象转一维数组
        if (is_object($data)) {
            return $data->toArray();
        }
        //数组内嵌一维对象 转二维数组
        $new_array = array();
        foreach ($data as $k => $v) {
            if (is_object($v)) {
                $v = $v->toArray();
            }
            $value = $value_name ? (isset($v[$value_name]) ? $v[$value_name] : '') : $v;
            if ($key_name == '') {
                $new_array[$k] = $value;//不转键名
            } elseif (isset($v[$key_name])) {
                $new_array[$v[$key_name]] = $value;
            }
        }
        return $new_array;
    }
}

if(!function_exists('cs_user')){
    function cs_user(){
        // 设置 测试账号id
        $rs=['1',2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17];
        return $rs;
    }
}

//生成二维码
if(!function_exists('qrcode')){
    function qrcode($url,$qrcode,$logo=FALSE){
        include EXTEND_PATH."/phpqrcode/phpqrcode.php";
        // 生成的二维码所在目录+文件名
        $path = ROOT_PATH."public/Uploads/payQRcode/";//生成的二维码所在目录
        if(!file_exists($path)){
            mkdir($path, 0700,true);
        }
        $qrcode = $qrcode.'.png';//生成的二维码文件名
        $fileName = $path.$qrcode;//1.拼装生成的二维码文件路径
        //注册链接 api/user/webregister?invitation_code=$invitation_code
//        $url = "http://share.xiaoyiyiliao.com/#/?be_invited=".$invitation_code;
        $data = $url;//2.生成二维码的数据(扫码显示该数据)
        $level = "H";  //3.纠错级别：L、M、Q、H
        $size = 10;//4.点的大小：1到10,用于手机端4就可以了
        ob_end_clean();//清空缓冲区
        \QRcode::png($data, $fileName, $level, $size,1);//生成二维码

        $QR = 'http://'.$_SERVER['HTTP_HOST'].'/Uploads/payQRcode/'.$qrcode;//已经生成的原始二维码图
//        dd($logo);
        if ($logo !== FALSE) {
            $QR = imagecreatefromstring(file_get_contents($QR));
            $logo = imagecreatefromstring(file_get_contents($logo));
            $QR_width = imagesx($QR);//二维码图片宽度
            $QR_height = imagesy($QR);//二维码图片高度
            $logo_width = imagesx($logo);//logo图片宽度
            $logo_height = imagesy($logo);//logo图片高度
            $logo_qr_width = $QR_width / 5; //logo图片在二维码图片中宽度大小
            $scale = $logo_width/$logo_qr_width;
            $logo_qr_height = $logo_height/$scale; //logo图片在二维码图片中高度大小
            $from_width = ($QR_width - $logo_qr_width) / 2;
            //重新组合图片并调整大小
            imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,
                $logo_qr_height, $logo_width, $logo_height);
            imagepng($QR, $fileName);
        }
        //文件名转码
        return $QR;
    }
}

if (!function_exists('savelog')){
    function savelog($data){
        error_log(
            date('Y-m-d H:i:s',time()).print_r($data,1)."\n",
            3,
            '../error.log'
        );
    }
}




if (!function_exists('checkIDNum')) {
    /**
     * function: checkIDNum
     * author: cc
     * date: 2019/5/7 9:51
     * 检测身份证号是否正确
     */
    function checkIDNum($num_id){
        $num_id = strtoupper($num_id);
        $regx = "/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/";
        $arr_split = array();
        if(!preg_match($regx, $num_id)){
            return FALSE;//正则校验
        }
//        dd($num_id);
        if(15==strlen($num_id)){
            //检查15位
            $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";
            @preg_match($regx, $num_id, $arr_split);
            //检查生日日期是否正确
            $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
            if(!strtotime($dtm_birth))
            {
                return FALSE;
            } else {
                return TRUE;
            }
        } else {
            //检查18位
            $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
            @preg_match($regx, $num_id, $arr_split);
            $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];

            if(!strtotime($dtm_birth)) {
                //检查生日日期是否正确
                return FALSE;
            } else {
                //检验18位身份证的校验码是否正确。
                //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
                $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                $sign = 0;
                for ( $i = 0; $i < 17; $i++ ) {
                    $b = (int) $num_id{$i};
                    $w = $arr_int[$i];
                    $sign += $b * $w;
                }
                $n = $sign % 11;
                $val_num = $arr_ch[$n];
                if ($val_num != substr($num_id,17, 1)) {
                    return FALSE;
                } else {
                    return TRUE;
                }
            }
        }
    }
}


if(!function_exists('getUrl')){
    function getUrl($url, $header = false) {
        $ch = curl_init($url);
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据不直接输出
        curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip压缩
        //add header
        if(!empty($header)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }

        try {
            $content = curl_exec($ch); //执行并存储结果
        } catch (\Exception $e) {
//            $this->_log($e->getMessage());
        }
        $curlError = curl_error($ch);

        curl_close($ch);
        return $content;
    }
}
if(!function_exists('curl_post')){
    function curl_post($url , $data=array()){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        // POST数据
        curl_setopt($ch, CURLOPT_POST, 1);
        // 把post的变量加上
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }
}
/**
 * 获取openid
 */
function getOpenid($code)
{
    $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.config('wetch.miniapp_id').'&secret='.config('wetch.key').'&js_code=' . $code . '&grant_type=authorization_code';
//    dd($url);
    $data = file_get_contents($url);
//    dd($data);
    if ($data) {
        $data = json_decode($data, true);
        if (isset($data['errcode']) && $data['errcode'] > 0) {
            return '';
        } elseif (isset($data['openid']) && !!$data['openid']) {
            return $data['openid'];
        }
    }
    return '';
}
/*
 * 发快递
 * */
if(!function_exists('express')){
    /*
     * $senderInfo 发件人信息,$receiveInfo收件人,$order_sn订单号
     * */
    function express($senderInfo,$receiveInfo,$order_sn){
        require EXTEND_PATH."/zopsdk/ZopClient.php";
        require EXTEND_PATH."/zopsdk/ZopProperties.php";
        require EXTEND_PATH."/zopsdk/ZopRequest.php";

        $data['partnerType']='2';
        $data['orderType']='1';
        $data['partnerOrderCode']=$order_sn;//订单号
        $data['senderInfo']=$senderInfo;//发件人信息
        $data['receiveInfo']=$receiveInfo;//收件人信息
//        $data['accountInfo']['accountId']='15aceea328171342fd79d_53100';//电子面单账号（测试环境传test）
        $data['accountInfo']['accountId']='test';//电子面单账号（测试环境传test）

        $da = json_encode($data);
//        dd($da);
        $properties = new ZopProperties(config('zhongtong.appKey'), config('zhongtong.AppSecret'));

//        $properties = new ZopProperties("3ba8e42ddc06ef5b8460d", "00a8f34890c00bfad409924e61b5105f");

        $client = new ZopClient($properties);

        $request = new ZopRequest();

        $request->setUrl("https://japi-test.zto.com/zto.open.createOrder");
//        $request->setUrl("https://japi.zto.com/zto.open.createOrder");

        $request->setBody($da);


        return  $aa = $client->execute($request);
    }
}
/**
 * 分享
 * $id 商品id,活动id
 * $type 1 微信小程序 2  qq
 * $types 类型:0=爆品,1=捐增,2=兑换 3 活动 4 商户
 * */
if(!function_exists('share')){
    function share($id='',$types=1){
        switch ($types){
            case 0:
                $qqurl = 'http://www.baidu.com';//qq - 注册链接
                $wxurl = 'http://www.baidu.com';//微信 - 小程序
                break;
            case 1:
                $qqurl = 'http://www.baidu.com';//qq - 注册链接
                $wxurl = 'http://www.baidu.com';//微信 - 小程序
                break;
            case 2:
                $qqurl = 'http://www.baidu.com';//qq - 注册链接
                $wxurl = 'http://www.baidu.com';//微信 - 小程序
                break;
            case 3:
                $qqurl = 'http://www.baidu.com';//qq - 注册链接
                $wxurl = 'http://www.baidu.com';//微信 - 小程序
                break;
            case 4:
                $qqurl = 'http://www.baidu.com';//qq - 注册链接
                $wxurl = 'http://www.baidu.com';//微信 - 小程序
                break;
        }
        $info['qqurl']= $qqurl;
        $info['wxurl']= $wxurl;
        return $info;
    }
}
/*
 * 数组转xml
 * */
function MapConvertXML($map) {
    if(!is_array($map) || count($map) <= 0) {
        throw new RuntimeException('数据异常!');
    }
    $XML = '<xml>';
    foreach ($map as $key=>$val) {
        if (is_numeric($val)){
            $XML.='<'.$key.'>'.$val.'</'.$key.'>';
        }else{
            $XML.='<'.$key.'><![CDATA['.$val.']]></'.$key.'>';
        }
    }
    $XML.='</xml>';
    return $XML;
}
//if(!function_exists('message')){
//
//}